import argparse
import pandas as pd  # 用于导出Excel
from ocr import get_resume_text
from identity import verify_identity
from spark_chat import SparkWs
from rtasr_client import RtAsrClient
from tts import synthesize_and_play
from config import (
    SPARK_APPID, SPARK_APIKey, SPARK_APISecret,
    SPARK_URL, SPARK_DOMAIN,
    RTASR_APPID, RTASR_APIKey
)
from emotion_utils import (
    start_emotion_recording,
    stop_emotion_recording,
    export_emotion_to_excel
)

from evaluation.ability_evaluator import evaluate_all
from evaluation.visual_report import generate_radar_chart
from evaluation.generate_chinese_pdf import create_pdf


def compute_final_score(scores: dict) -> float:
    weights = {
        "专业知识水平": 0.25,
        "技能匹配度": 0.20,
        "语言表达能力": 0.20,
        "逻辑思维能力": 0.15,
        "应变抗压能力": 0.20
    }
    weighted_sum = sum(scores[k] * weights[k] for k in weights)
    return round(weighted_sum, 2)


def generate_suggestions(scores):
    suggestions = []
    if scores["语言表达能力"] < 60:
        suggestions.append("建议加强回答结构训练，可使用STAR法则（Situation-Task-Action-Result）。")
    if scores["应变抗压能力"] < 60:
        suggestions.append("情绪波动较大，建议提前做压力场景模拟训练，提升抗压应变能力。")
    if scores["专业知识水平"] < 60:
        suggestions.append("建议针对岗位相关知识点进行系统性补充。")
    if not suggestions:
        suggestions.append("总体表现良好，建议继续保持并在真实场景中多加练习。")
    return suggestions


def main():
    parser = argparse.ArgumentParser(description="AI 面试系统主程序")
    parser.add_argument('--input', type=str, default="registered_face.jpg", help='简历图片路径')
    args = parser.parse_args()
    resume_path = args.input

    print("🛂 正在进行身份核验，请正对摄像头...")
    if not verify_identity():
        print("❌ 身份验证未通过，系统已退出")
        exit(1)

    if not resume_path:
        print("❌ 未指定简历图片路径，请使用 --input resume.jpg 参数传入")
        exit(1)

    print(f"✅ 身份验证通过，开始读取简历：{resume_path}")
    resume_summary = get_resume_text(resume_path)

    system_prompt = f"""
你是一位具备严谨思维和亲切表达能力的专业面试官，现在请根据以下简历内容对候选人进行模拟面试：

{resume_summary}

请遵循以下规范：
1. 使用正式语气 + 适度亲和进行提问；
2. 每轮只问一个聚焦的问题；
3. 可点评经历，但要简洁专业；
4. 基于上轮回答提出延伸问题；
5. 鼓励举例，避免机械化；
6. 用普通话进行中文对话；
7. 一定要总结回应上一个问题的回答，与用户进行交互；

禁止：
- 多个问题；
- 娱乐化语气；
- 展示AI身份或结束语。
"""

    chatbot = SparkWs(SPARK_APPID, SPARK_APIKey, SPARK_APISecret, SPARK_URL, SPARK_DOMAIN, system_prompt)

    interview_records = []

    print("\n🧠 星火正在生成首轮问题...\n星火: ", end="", flush=True)
    chatbot.send_prompt("")
    synthesize_and_play(chatbot.answer)

    interview_records.append({
        "轮次": 0,
        "我（用户）": "",
        "星火（AI）": chatbot.answer
    })

    round_number = 1
    MAX_ROUNDS = 3

    while round_number <= MAX_ROUNDS:
        print(f"\n🎯 第 {round_number} 轮面试开始")
        method = input("是否使用语音回答？(y/n): ").strip().lower()

        user_input = ""
        if method == "y":
            print("🎤 请开始回答（限时10秒）...")

            thread = start_emotion_recording()
            rtasr = RtAsrClient(RTASR_APPID, RTASR_APIKey)
            rtasr.connect()
            rtasr.record_and_send(duration_sec=10)
            user_input = rtasr.get_result()
            print("\n📝 转写内容：", user_input)
            stop_emotion_recording()
            thread.join()
        else:
            user_input = input("\n我: ").strip()
            if not user_input:
                continue

        print("星火: ", end="", flush=True)
        chatbot.send_prompt(user_input)
        synthesize_and_play(chatbot.answer)

        interview_records.append({
            "轮次": round_number,
            "我（用户）": user_input,
            "星火（AI）": chatbot.answer
        })

        round_number += 1

    print("\n✅ 面试已完成 3 轮，感谢您的参与！")

    # 保存对话记录
    dialogue_excel_path = "interview_dialogue.xlsx"
    df = pd.DataFrame(interview_records)
    df.to_excel(dialogue_excel_path, index=False)
    print(f"📄 面试问答已保存为 {dialogue_excel_path}")

    # 导出情绪数据
    export_emotion_to_excel()
    print("📊 情绪数据已保存。")

    # 读取简历文本（这里复用已获取的resume_summary）
    resume_text = resume_summary

    # 评估能力得分
    emotion_excel_path = "emotion_analysis_result.xlsx"
    scores, _, _ = evaluate_all(resume_text, dialogue_excel_path, emotion_excel_path)

    # 计算最终得分和建议
    final_score = compute_final_score(scores)
    suggestions = generate_suggestions(scores)

    # 生成雷达图
    generate_radar_chart(scores, output_path="radar_chart.png")

    # 生成PDF报告
    create_pdf(
        output_path="interview_report.pdf",
        scores=scores,
        suggestions=suggestions,
        radar_chart_path="radar_chart.png",
        resume_text=resume_text,
        final_score=final_score
    )

    print("✅ 报告已生成：interview_report.pdf")


if __name__ == "__main__":
    main()
